#include <memory>
#include <utility>
#include <vector>
#include <iostream>

class Developer {
	public:
	virtual ~Developer() = default;
	virtual void develop() = 0;
};

class FrontEndDeveloper : public Developer {
	public:
	void develop() override {
		developFrontEnd();
	}

	private:
	void developFrontEnd() {
		std::cout << "Front End developing" << std::endl;
	}
};

class BackEndDeveloper : public Developer {
	public:
	void develop() override {
		developBackEnd();
	}

	private:
	void developBackEnd() {
		std::cout << "Back End developing" << std::endl;
	}
};

class Project {
	public:
	using Ds = std::vector<std::unique_ptr<Developer>>;

	explicit Project(Ds developers) : developers_{std::move(developers)}
	{}

	void deliver() {
		for (auto &dev: developers_) {
			dev->develop();
		}
	}

	private:
		Ds developers_;
};

int main() {
	auto developers = Project::Ds{};
	developers.emplace_back(std::make_unique<FrontEndDeveloper>());
	developers.emplace_back(std::make_unique<BackEndDeveloper>());
	auto project = Project{std::move(developers)};
	project.deliver();

	return 0;
}
